package com.payment.system.mapper;

import com.payment.common.annotation.DataSource;
import com.payment.common.enums.DataSourceType;
import com.payment.system.domain.MoneyChange;
import com.payment.system.vo.*;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 资金变动 数据层
 *
 * @author payment
 * @date 2019-01-08
 */
public interface MoneyChangeMapper {
    /**
     * 查询资金变动信息
     *
     * @param iD 资金变动ID
     * @return 资金变动信息
     */
    @DataSource(DataSourceType.SLAVE)
    public MoneyChange selectMoneyChangeById(String iD);

    /**
     * 查询资金变动列表
     *
     * @param moneyChange 资金变动信息
     * @return 资金变动集合
     */
    @DataSource(DataSourceType.SLAVE)
    public List<MoneyChange> selectMoneyChangeList(MoneyChange moneyChange);

    /**
     * 新增资金变动
     *
     * @param moneyChange 资金变动信息
     * @return 结果
     */
    public int insertMoneyChange(MoneyChange moneyChange);

    /**
     * 修改资金变动
     *
     * @param moneyChange 资金变动信息
     * @return 结果
     */
    public int updateMoneyChange(MoneyChange moneyChange);

    /**
     * 删除资金变动
     *
     * @param iD 资金变动ID
     * @return 结果
     */
    public int deleteMoneyChangeById(String iD);

    /**
     * 批量删除资金变动
     *
     * @param iDs 需要删除的数据ID
     * @return 结果
     */
    public int deleteMoneyChangeByIds(String[] iDs);

    //查询分润返佣明细  返回定义明细Vo
    @DataSource(DataSourceType.SLAVE)
    List<MoneyChangeVo> selectMoneyChangeVoList(MoneyChangeVo moneyChangeVo);

    //申请体现列表
    @DataSource(DataSourceType.SLAVE)
    List<MoneyChange> applyMoneyList(MoneyChange moneyChange);

    //app端公告列表
    @DataSource(DataSourceType.SLAVE)
    List<AppMoneyChangeVo> selectMoneyChangeListByWhere();

    //app端今日利润总额
    @DataSource(DataSourceType.SLAVE)
    BigDecimal selectTodayProfitByMerchantId(@Param("merchantNo") String merchantNo, @Param("merchantId") String merchantId);

    //app端昨日利润总额
    @DataSource(DataSourceType.SLAVE)
    BigDecimal selectYesterdayProfitByMerchantId(@Param("merchantNo") String merchantNo, @Param("merchantId") String merchantId);

    //本月分润总额
    @DataSource(DataSourceType.SLAVE)
    BigDecimal selectMonthTrxAmtProfitByMerchantId(@Param("merchantNo") String merchantNo, @Param("merchantId") String merchantId);

    // app端今日或昨日利润列表
    @DataSource(DataSourceType.SLAVE)
    List<ProfitVo> selectMoneyChangeListByUserIdAndDate(@Param("merchantNo") String merchantNo, @Param("merchantId") String merchantId, @Param("type") String type, @Param("num") Integer num, @Param("size") Integer size);

    // app端今日或昨日利润列表 shopping
    @DataSource(DataSourceType.SLAVE)
    List<ProfitVo> profitDetailsByShopping(@Param("merchantNo") String merchantNo, @Param("merchantId") String merchantId, @Param("type") String type, @Param("num") Integer num, @Param("size") Integer size);

    //app端 获取提现记录
    @DataSource(DataSourceType.SLAVE)
    List<Map<String, Object>> selectCashWithdrawalList(@Param("merchantId") String merchantId, @Param("num") Integer num, @Param("size") Integer size);

    //app端 获取提现记录
    @DataSource(DataSourceType.SLAVE)
    List<MoneyChange> selectprofitList(@Param("merchantId") String merchantId, @Param("merchantNo") String merchantNo, @Param("num") Integer num, @Param("size") Integer size);

    //app 获取当月提现总金额
    @DataSource(DataSourceType.SLAVE)
    WithdrawMoneyVo selectMonthRecordWithdrawMoney(@Param("merchantId") String merchantId);

    //app 总奖励金
    @DataSource(DataSourceType.SLAVE)
    Double selectMoneyChangeByMerchantId(@Param("merchantNo") String merchantNo, @Param("merchantId") String merchantId);

    //月统计插叙分润金额 默认查询当前半年
    @DataSource(DataSourceType.SLAVE)
    List<ProfitTotalMonthVo> selectMoneyChangeMonthCountById(@Param("merchantNo") String merchantNo, @Param("merchantId") String merchantId, @Param("month") String month);

    //查询指定月份的分润金额 ：分别 统计刷卡/贷款/办卡 默认当前月
    @DataSource(DataSourceType.SLAVE)
    List<Map<String, Object>> selectTotalMoneyByMonth(@Param("merchantNo") String merchantNo, @Param("merchantId") String merchantId, @Param("month") String month);

    /**
     * 根据资金类型和用户id  查询金额
     * @param merchantId
     * @param merchantNo
     * @param moneyType
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    BigDecimal selectSumTrxAmtByMoneyType(@Param("merchantId") String merchantId, @Param("merchantNo") String merchantNo, @Param("moneyType") String moneyType);


    /**
     * 根据资金类型和用户id  查询账户总收益
     * @param merchantId
     * @param merchantNo
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    BigDecimal selectTotalRevenueByMoneyType(@Param("merchantId") String merchantId, @Param("merchantNo") String merchantNo);

    //分享 ：收益详情列表
    @DataSource(DataSourceType.SLAVE)
    List<Map<String, Object>> selectProfitDetailsList(@Param("merchantId") String merchantId, @Param("merchantNo") String merchantNo, @Param("searchMonth") String searchMonth, @Param("num") int num, @Param("size") Integer size);

    //分享 ：收益详情列表 shopping
    @DataSource(DataSourceType.SLAVE)
    List<Map<String, Object>> selectProfitDetailsListByShopping(@Param("merchantId") String merchantId, @Param("merchantNo") String merchantNo, @Param("searchMonth") String searchMonth, @Param("num") int num, @Param("size") Integer size);

    //总收益  不等与提现和积分提现
    @DataSource(DataSourceType.SLAVE)
    BigDecimal selectTotalRevenueByMonth(@Param("merchantId") String merchantId, @Param("merchantNo") String merchantNo, @Param("searchMonth") String searchMonth);

    //总收益  不等与提现和积分提现
    @DataSource(DataSourceType.SLAVE)
    BigDecimal selectTotalRevenueByMonthAndShopping(@Param("merchantId") String merchantId, @Param("searchMonth") String searchMonth);

	/**
	 * 订单分润交易流水
	 * 
	 * @param moneyChangeVo
	 * @return
	 */
	@DataSource(DataSourceType.SLAVE)
	List<MoneyChangeNewOederVo> selectMoneyChangeVoListByNewOrder(MoneyChangeNewOederVo moneyChangeVo);

    /**
     * 统计分润金额和交易笔数
     * @param moneyChangeVo
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    Map<String, Object> selectCountMoneyChange(MoneyChangeNewOederVo moneyChangeVo);

    /**
     * /升级列表
     * @param upgradeVo
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    List<MoneyChangeNewOederVo> selectMoneyChangeVoListByUpgrade(MoneyChangeNewOederVo upgradeVo);

    /**
     * 统计升级  分润金额和交易笔数
     * @param upgradeVo
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    Map<String, Object> selectCountMoneyChangeByUpgrade(MoneyChangeNewOederVo upgradeVo);

    //根据用户id 和分润类型统计总金额
    @DataSource(DataSourceType.SLAVE)
    BigDecimal selectTotalByMerchantIdAndMoneyType(@Param("merchantId") String merchantId, @Param("moneyType") String moneyType);


    //测试数据
    List<MoneyChange> selectMoneyChangeListByTest(@Param("num") Integer pageNum, @Param("size") Integer pageSize);

    @DataSource(DataSourceType.SLAVE)
    List<MoneyChange> selectMoneyChangeListByOrderId(@Param("orderId") String orderId);

    /**
     * 查询收益列表
     *
     * @param type
     * @param pageNum
     * @param pageSize
     * @param merchantId
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    List<Map<String, Object>> selectProfitList(@Param("type") String type, @Param("num") Integer pageNum, @Param("size") Integer pageSize, @Param("merchantId") String merchantId);

    /**
     * 订单ID  moneyType查询
     *
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    List<MoneyChange> selectMoneyChangeByOrderIdAndMoneyType(@Param("orderId") String orderId, @Param("moneyType") String moneyType);

    /**
     * 积分明细列表 商城积分兑换/充值分润
     * @param merchantId
     */
    @DataSource(DataSourceType.SLAVE)
    List<MoneyChange>  selectShoppingScoreList(@Param("merchantId")String merchantId, @Param("num") Integer pageNum, @Param("size") Integer pageSize);




    @DataSource(DataSourceType.SLAVE)
    List<MoneyChange>  selectListFrozenMoney();

    /**
     * 解冻用户ID列表
     * @param time1
     * @param time2
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    public List<String> selectFanXianUserIdList(@Param("time1") String time1, @Param("time2") String time2);

    /**
     * 查询金额
     * @param moneyChangeVo
     * @return
     */
    @DataSource(DataSourceType.SLAVE)
    Map<String, Object> selectCountMoneyChangeCommission(MoneyChangeNewOederVo moneyChangeVo);

	List<Map<String, Object>> selectNewProfitList(@Param("num") Integer pageNum, @Param("size") Integer pageSize,
			@Param("merchantId") String merchantId,@Param("time") String time,@Param("timeEnd") String timeEnd);

	public List<MoneyChange> selectListByMoneyTypeAndStutas(@Param("merid") String merchantId,
			@Param("type") String moneyType, @Param("status") String status);
	/**
	 * 统计过期的核心合伙人分润
	 * @param time
	 */
	public List<MoneyChange> partnerList(@Param("time")String time);

    /**
     * 查询最新20条升级分润记录
     */
    List<Map<String, Object>> selectPaymentOrderListByUpgrade();
}

